﻿#define  _CRT_SECURE_NO_WARNINGS

#include <graphics.h>
#include <tchar.h>
#include <conio.h>

int main() {
    // 1. 数据准备（X单位：cm；B单位：×10⁻³）
    double X[] = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0 };
    double B[] = { 6.26, 6.24, 6.24, 6.25, 6.24, 6.24, 6.23, 6.20, 6.20, 6.18, 6.13, 6.04, 5.83, 5.18, 3.28 };
    int dataCount = sizeof(X) / sizeof(X[0]);

    // 2. 初始化图形窗口
    initgraph(800, 600);
    setbkcolor(WHITE);
    cleardevice();
    settextcolor(BLACK);

    // 3. 坐标轴参数
    int originX = 100, originY = 500;  // 原点坐标
    int xAxisLen = 600, yAxisLen = 400;  // 坐标轴长度
    double xMax = 14.0, yMax = 6.5;       // X最大值14cm，B最大值预留至6.5（×10⁻³）

    // 4. 绘制坐标轴（黑色线条）
    setlinecolor(BLACK);
    line(originX, originY, originX + xAxisLen, originY);  // X轴（X）
    line(originX, originY, originX, originY - yAxisLen);  // Y轴（B）

    // 5. 绘制标题
    settextstyle(24, 0, _T("宋体"));
    outtextxy(300, 30, _T("B-X折线图"));

    // 6. 绘制轴标签
    settextstyle(16, 0, _T("宋体"));
    outtextxy(350, 520, _T("X (cm)"));  // X轴标签
    outtextxy(30, 250, _T("B (×10⁻³)"));   // Y轴标签

    // 7. X轴刻度与数值（每2cm一个刻度）
    for (int i = 0; i <= 7; i++) {
        double xVal = 2 * i;  // 刻度值：0, 2, 4, ..., 14
        int x = originX + (int)((xVal / xMax) * xAxisLen);
        line(x, originY, x, originY + 5);  // 刻度线

        TCHAR buf[20];
        _stprintf(buf, _T("%.1f"), xVal);
        outtextxy(x - 10, originY + 10, buf);
    }

    // 8. Y轴刻度与数值（每0.5（×10⁻³）一个刻度）
    for (int i = 0; i <= 13; i++) {
        double bVal = 3.0 + 0.25 * i;  // 刻度值：3.0, 3.25, ..., 6.25（×10⁻³）
        int y = originY - (int)(((bVal - 3.0) / (yMax - 3.0)) * yAxisLen);  // 从3.0开始映射
        line(originX, y, originX - 5, y);  // 刻度线

        TCHAR buf[20];
        _stprintf(buf, _T("%.2f"), bVal);
        outtextxy(originX - 60, y - 8, buf);
    }

    // 9. 绘制数据点与折线（红色）
    setlinecolor(RED);
    setfillcolor(RED);
    int prevX, prevY;
    for (int i = 0; i < dataCount; i++) {
        int x = originX + (int)((X[i] / xMax) * xAxisLen);
        int y = originY - (int)(((B[i] - 3.0) / (yMax - 3.0)) * yAxisLen);  // 从3.0开始映射
        fillcircle(x, y, 3);  // 数据点
        if (i > 0) line(prevX, prevY, x, y);  // 折线
        prevX = x;
        prevY = y;
    }

    // 10. 等待按键关闭窗口
    _getch();
    closegraph();
    return 0;
}

//#include <graphics.h>
//#include <tchar.h>
//#include <conio.h>
//
//int main() {
//    // 1. 新数据准备（Im与对应的UH）
//    double Im[] = { 0, 100, 200, 300, 400, 500 };  // 单位：mA
//    double UH[] = { 0.175, 0.6175, 1.2225, 1.83, 2.4375, 3.0425 };  // 单位：mV
//    int dataCount = sizeof(Im) / sizeof(Im[0]);
//
//    // 2. 初始化图形窗口
//    initgraph(800, 600);
//    setbkcolor(WHITE);
//    cleardevice();
//    settextcolor(BLACK);
//
//    // 3. 坐标轴参数
//    int originX = 100, originY = 500;  // 原点坐标
//    int xAxisLen = 600, yAxisLen = 400;  // 坐标轴长度
//    double xMax = 500, yMax = 3.5;       // Im最大值500mA，UH最大值预留至3.5mV
//
//    // 4. 绘制坐标轴（显式设置线条颜色为黑色）
//    setlinecolor(BLACK);
//    line(originX, originY, originX + xAxisLen, originY);  // X轴（Im）
//    line(originX, originY, originX, originY - yAxisLen);  // Y轴（UH）
//
//    // 5. 绘制标题
//    settextstyle(24, 0, _T("宋体"));
//    outtextxy(300, 30, _T("UH-Im折线图"));
//
//    // 6. 绘制轴标签
//    settextstyle(16, 0, _T("宋体"));
//    outtextxy(350, 520, _T("Im (mA)"));  // X轴标签
//    outtextxy(30, 250, _T("UH (mV)"));   // Y轴标签
//
//    // 7. X轴刻度与数值（每100mA一个刻度）
//    for (int i = 0; i <= 5; i++) {
//        double imVal = 100 * i;  // 刻度值：0, 100, ..., 500
//        int x = originX + (int)((imVal / xMax) * xAxisLen);
//        line(x, originY, x, originY + 5);  // 刻度线
//
//        TCHAR buf[20];
//        _stprintf(buf, _T("%.0f"), imVal);  // 整数格式显示Im
//        outtextxy(x - 15, originY + 10, buf);
//    }
//
//    // 8. Y轴刻度与数值（每0.5mV一个刻度）
//    for (int i = 0; i <= 7; i++) {
//        double uhVal = 0.5 * i;  // 刻度值：0, 0.5, ..., 3.5
//        int y = originY - (int)((uhVal / yMax) * yAxisLen);
//        line(originX, y, originX - 5, y);  // 刻度线
//
//        TCHAR buf[20];
//        _stprintf(buf, _T("%.2f"), uhVal);
//        outtextxy(originX - 50, y - 8, buf);
//    }
//
//    // 9. 绘制数据点与折线（红色）
//    setlinecolor(RED);
//    setfillcolor(RED);
//    int prevX, prevY;
//    for (int i = 0; i < dataCount; i++) {
//        int x = originX + (int)((Im[i] / xMax) * xAxisLen);
//        int y = originY - (int)((UH[i] / yMax) * yAxisLen);
//        fillcircle(x, y, 3);  // 数据点
//        if (i > 0) line(prevX, prevY, x, y);  // 折线
//        prevX = x;
//        prevY = y;
//    }
//
//    // 10. 等待按键关闭窗口
//    _getch();
//    closegraph();
//    return 0;
//}

//#include <graphics.h>
//#include <tchar.h>
//#include <conio.h>
//
//int main() {
//    // 数据准备
//    double Is[] = { 0.00, 0.50, 1.00, 1.50, 2.00, 2.50, 3.00 };
//    double UH[] = { 0.0075, 0.505, 1.015, 1.515, 2.0225, 2.5325, 3.03 };
//    int dataCount = sizeof(Is) / sizeof(Is[0]);
//
//    // 初始化图形窗口
//    initgraph(800, 600);
//    setbkcolor(WHITE);
//    cleardevice();
//    settextcolor(BLACK);
//
//    // 坐标轴参数
//    int originX = 100, originY = 500;
//    int xAxisLen = 600, yAxisLen = 400;
//    double xMax = 3.0, yMax = 3.2;
//
//    // 显式设置坐标轴线条颜色为黑色
//    setlinecolor(BLACK);
//
//    // 1. 绘制坐标轴
//    line(originX, originY, originX + xAxisLen, originY);  // X轴
//    line(originX, originY, originX, originY - yAxisLen);  // Y轴
//
//    // 2. 绘制标题
//    settextstyle(24, 0, _T("宋体"));
//    outtextxy(300, 30, _T("UH-Is折线图"));
//
//    // 3. 绘制轴标签
//    settextstyle(16, 0, _T("宋体"));
//    outtextxy(350, 520, _T("Is (mA)"));
//    outtextxy(30, 250, _T("UH (mV)"));
//
//    // 4. X轴刻度与数值
//    for (int i = 0; i <= 6; i++) {
//        double isVal = 0.5 * i;
//        int x = originX + (int)((isVal / xMax) * xAxisLen);
//        line(x, originY, x, originY + 5);
//
//        TCHAR buf[20];
//        _stprintf(buf, _T("%.2f"), isVal);
//        outtextxy(x - 15, originY + 10, buf);
//    }
//
//    // 5. Y轴刻度与数值
//    for (int i = 0; i <= 7; i++) {
//        double uhVal = 0.5 * i;
//        int y = originY - (int)((uhVal / yMax) * yAxisLen);
//        line(originX, y, originX - 5, y);
//
//        TCHAR buf[20];
//        _stprintf(buf, _T("%.2f"), uhVal);
//        outtextxy(originX - 50, y - 8, buf);
//    }
//
//    // 6. 绘制数据点和折线（设置为红色）
//    setlinecolor(RED);
//    setfillcolor(RED);
//    int prevX, prevY;
//    for (int i = 0; i < dataCount; i++) {
//        int x = originX + (int)((Is[i] / xMax) * xAxisLen);
//        int y = originY - (int)((UH[i] / yMax) * yAxisLen);
//        fillcircle(x, y, 3);
//        if (i > 0) line(prevX, prevY, x, y);
//        prevX = x;
//        prevY = y;
//    }
//
//    _getch();
//    closegraph();
//    return 0;
//}

//#include <graphics.h>
//#include <tchar.h>  // 支持_T宏和_stprintf
//#include <conio.h>
//
//int main() {
//    // 数据准备
//    double Is[] = { 0.00, 0.50, 1.00, 1.50, 2.00, 2.50, 3.00 };
//    double UH[] = { 0.0075, 0.505, 1.015, 1.515, 2.0225, 2.5325, 3.03 };
//    int dataCount = sizeof(Is) / sizeof(Is[0]);
//
//    // 初始化图形窗口
//    initgraph(800, 600);
//    setbkcolor(WHITE);
//    cleardevice();
//    settextcolor(BLACK);  // 黑色文字，与白色背景对比
//
//    // 坐标轴参数
//    int originX = 100, originY = 500;
//    int xAxisLen = 600, yAxisLen = 400;
//    double xMax = 3.0, yMax = 3.2;
//
//    // 1. 绘制坐标轴
//    line(originX, originY, originX + xAxisLen, originY);  // X轴
//    line(originX, originY, originX, originY - yAxisLen);  // Y轴
//
//    // 2. 绘制标题（使用_T宏）
//    settextstyle(24, 0, _T("宋体"));  // 宽字符字体设置
//    outtextxy(300, 30, _T("UH-Is折线图"));  // 宽字符标题
//
//    // 3. 绘制轴标签（使用_T宏）
//    settextstyle(16, 0, _T("宋体"));
//    outtextxy(350, 520, _T("Is (mA)"));  // X轴标签
//    outtextxy(30, 250, _T("UH (mV)"));   // Y轴标签
//
//    // 4. X轴刻度与数值（使用_T宏和宽字符格式化）
//    for (int i = 0; i <= 6; i++) {
//        double isVal = 0.5 * i;
//        int x = originX + (int)((isVal / xMax) * xAxisLen);
//        line(x, originY, x, originY + 5);  // 刻度线
//
//        TCHAR buf[20];  // 宽字符缓冲区
//        _stprintf(buf, _T("%.2f"), isVal);  // 宽字符格式化
//        outtextxy(x - 15, originY + 10, buf);  // 显示数值
//    }
//
//    // 5. Y轴刻度与数值（使用_T宏和宽字符格式化）
//    for (int i = 0; i <= 7; i++) {
//        double uhVal = 0.5 * i;
//        int y = originY - (int)((uhVal / yMax) * yAxisLen);
//        line(originX, y, originX - 5, y);  // 刻度线
//
//        TCHAR buf[20];
//        _stprintf(buf, _T("%.2f"), uhVal);
//        outtextxy(originX - 50, y - 8, buf);  // 显示数值
//    }
//
//    // 6. 绘制数据点和折线
//    setlinecolor(RED);
//    setfillcolor(RED);
//    int prevX, prevY;
//    for (int i = 0; i < dataCount; i++) {
//        int x = originX + (int)((Is[i] / xMax) * xAxisLen);
//        int y = originY - (int)((UH[i] / yMax) * yAxisLen);
//        fillcircle(x, y, 3);  // 数据点
//        if (i > 0) line(prevX, prevY, x, y);  // 折线
//        prevX = x;
//        prevY = y;
//    }
//
//    // 等待按键关闭窗口
//    _getch();
//    closegraph();
//    return 0;
//}